package realip

import (
	"context"
	"net/http"
	"strings"
	"time"

	"github.com/sohaha/zlsgo/zhttp"
	"github.com/sohaha/zlsgo/zsync"
)

func GetCloudflare(timeout ...time.Duration) []string {
	const (
		cfIPv4CIDRsEndpoint = "https://www.cloudflare.com/ips-v4"
		cfIPv6CIDRsEndpoint = "https://www.cloudflare.com/ips-v6"
	)

	var (
		t       time.Duration
		wg      zsync.WaitGroup
		mu      = zsync.NewRBMutex()
		cfCIDRs = make([]string, 0)
	)
	if len(timeout) > 0 {
		t = timeout[0]
	} else {
		t = time.Second * 5
	}

	ctx, cancel := context.WithTimeout(context.Background(), t)
	defer cancel()

	for _, v := range []string{cfIPv4CIDRsEndpoint, cfIPv6CIDRsEndpoint} {
		endpoint := v
		wg.Go(func() {
			resp, err := zhttp.Get(endpoint, ctx)
			if err == nil && resp.StatusCode() == http.StatusOK {
				mu.Lock()
				cfCIDRs = append(cfCIDRs, strings.Split(resp.String(), "\n")...)
				mu.Unlock()
			}
		})
	}

	wg.Wait()

	if len(cfCIDRs) == 0 {
		cfCIDRs = []string{"173.245.48.0/20", "103.21.244.0/22", "103.22.200.0/22", "103.31.4.0/22", "141.101.64.0/18", "108.162.192.0/18", "190.93.240.0/20", "188.114.96.0/20", "197.234.240.0/22", "198.41.128.0/17", "162.158.0.0/15", "104.16.0.0/13", "104.24.0.0/14", "172.64.0.0/13", "131.0.72.0/22", "2400:cb00::/32", "2606:4700::/32", "2803:f800::/32", "2405:b500::/32", "2405:8100::/32", "2a06:98c0::/29", "2c0f:f248::/32"}
	}

	return cfCIDRs
}
